package br.com.gkarian.mydesk.services;

import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.caelum.vraptor.ioc.Component;
import br.com.gkarian.mydesk.dao.interfaces.UsuarioDAO;
import br.com.gkarian.mydesk.model.Usuario;
import br.com.gkarian.mydesk.services.interfaces.UsuarioService;

@Component
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public class UsuarioServiceImpl implements UsuarioService {

	private static final Logger LOG = Logger.getLogger(UsuarioServiceImpl.class);
	
	private UsuarioDAO usuarioDao;
	
	public UsuarioServiceImpl(UsuarioDAO usuarioDao) {
		this.usuarioDao = usuarioDao;
	}

	@Override
	public Usuario cadastrarUsuario(Usuario usuario) throws Exception {
		LOG.info("Cadastrando Usuario de login = " + usuario.getLogin());
		usuario = usuarioDao.salvar(usuario);
		LOG.info("Usuario de ID [" + usuario.getId() + "] cadastrado com sucesso");
		return usuario;
	}
	
	@Override
	public boolean isExisteLogin(String login) throws Exception {
		return usuarioDao.isExisteLogin(login);
	}

	@Override
	public Usuario carregar(Usuario usuario) throws Exception {
		LOG.info("Recuperando Usuario de ID [" + usuario.getId() + "]");
		usuario = usuarioDao.carregar(usuario);
		LOG.info("Usuario de ID [" + usuario.getId() + "] recuperado com sucesso");
		return usuario;
	}

	@Override
	public Usuario adicionar(Usuario usuario) throws Exception {
		LOG.info("Adicionando Usuario de login [" + usuario.getLogin() + "]");
		usuario = usuarioDao.salvar(usuario);
		LOG.info("Usuario de ID [" + usuario.getId() + "] foi adicionado com sucesso");
		return usuario;
	}

	@Override
	public void atualizar(Usuario usuario) throws Exception {
		LOG.info("Atualizando usuario de ID ["+ usuario.getId()+ "]");
		usuarioDao.atualizar(usuario);
		LOG.info("Usuario de ID [" + usuario.getId() + "] atualizado com sucesso");
	}

	@Override
	public Usuario carregar(Integer userId) throws Exception {
		LOG.info("Recuperando Usuario de ID [" + userId + "]");
		Usuario usuario = usuarioDao.carregar(userId);
		LOG.info("Usuario de ID [" + usuario.getId() + "] recuperado com sucesso");
		return usuario;
	}

	@Override
	public Usuario carregarComListContaBancaria(Usuario usuario) throws Exception {
		LOG.info("Carregando Usuario de ID [" + usuario.getId() + "] com lista de ContaBancaria");
		usuario = usuarioDao.carregarComListContaBancaria(usuario);
		LOG.info("Usuario de ID [" + usuario.getId() + "] carregado com " + usuario.getListContasBancarias().size() + " Contas Bancarias");
		return usuario;
	}

	@Override
	public Usuario carregarParaListarTransacoes(Usuario usuario) throws Exception {
		LOG.info("Carregando Usuario de ID [" + usuario.getId() + "] com lista de Transações");
		usuario = usuarioDao.carregarParaListarTransacoes(usuario);
		LOG.info("Usuario de ID [" + usuario.getId() + "] carregado com " + usuario.getListTransacao().size() + " Transacoes");
		return usuario;
	}

	@Override
	public Usuario carregarParaCadastroTransacao(Usuario usuario) throws Exception {
		LOG.info("Carregando Usuario de ID [" + usuario.getId() + "] para cadastro de transação");
		usuario = usuarioDao.carregarParaCadastroTransacao(usuario);
		LOG.info("Usuario de ID [" + usuario.getId() + "] carregado com sucesso");
		return usuario;
	}

	@Override
	public Usuario carregarComListTipoTransacao(Usuario usuario) throws Exception {
		LOG.info("Carregando Usuario de ID [" + usuario.getId() + "] com lista de TipoTransação");
		usuario = usuarioDao.carregarComListTipoTransacao(usuario);
		LOG.info("Usuario de ID [" + usuario.getId() + "] carregado com " + usuario.getListTipoTransacao().size() + " TipoTransação");
		return usuario;
	}
	
}
